<?php
// +----------------------------------------------------------------------
// | 模型
// +----------------------------------------------------------------------
declare(strict_types=1);

namespace app\model;

use think\Model;
use think\db\Query;

/**
 * 系统用户消息模型
 *
 * Class SystemUsersMessagesModel
 * @package app\model
 * @OA\Schema(
 *   schema="SystemUsersMessages",
 *   type="object",
 *   @OA\Property(description="ID", property="id", type="integer", example=1),
 *   @OA\Property(description="用户ID", property="userId", type="integer", example=1),
 *   @OA\Property(description="标题类型", property="title", type="string", example="系统消息"),
 *   @OA\Property(description="内容", property="description", type="string", example="您有1条待处理审批，请及时查看"),
 *   @OA\Property(description="是否已读", property="isRead", type="boolean", example=true),
 *   @OA\Property(description="创建时间", property="createTime", type="string", format="date-time", example="2024-01-01T12:00:00Z"),
 *   @OA\Property(description="更新时间", property="updateTime", type="string", format="date-time", example="2024-01-02T12:00:00Z")
 * )
 */
class SystemUsersMessagesModel extends Model
{
    // 设置表名
    protected $name = 'system_users_messages';
    // 设置字段信息
    protected $schema = [
        'id'           => 'int',
        // 用户ID
        'user_id'      => 'int',
        // 标题类型
        'title'        => 'string',
        // 内容
        'description'  => 'string',
        // 是否已读
        'is_read'      => 'bool',
        // 创建时间
        'create_time'  => 'datetime',
        // 更新时间
        'update_time'  => 'datetime',
    ];
    // 模型数据不区分大小写
    protected $strict = false;
    // 数据转换为驼峰命名
    protected $convertNameToCamel = true;

    /**
     * 获取完整数据（包含关联与排序）
     * 
     * @return Query
     */
    static public function queryOrder()
    {
        return self::order([
            'id' => 'desc'
        ]);
    }

    /**
     * 搜索器 - 用户
     * 
     * @param Query $query 请求
     * @param mixed $value 字段值
     * @param array $data 完整数据
     * @return
     */
    public function searchUidAttr($query, $value, $data)
    {
        $query->where('user_id', $value);
    }

    /**
     * 搜索器 - 指定ID
     * 
     * @param Query $query 请求
     * @param mixed $value 字段值
     * @param array $data 完整数据
     * @return
     */
    public function searchIdsAttr($query, $value, $data)
    {
        if (is_array($value)) {
            $query->whereIn('id', $value);
        }
    }

    /**
     * 搜索器 - 标题类型
     * 
     * @param Query $query 请求
     * @param mixed $value 字段值
     * @param array $data 完整数据
     * @return
     */
    public function searchTitleAttr($query, $value, $data)
    {
        $query->where('title', 'like', '%' . $value . '%');
    }

    /**
     * 搜索器 - 是否已读
     * 
     * @param Query $query 请求
     * @param mixed $value 字段值
     * @param array $data 完整数据
     * @return
     */
    public function searchIsReadAttr($query, $value, $data)
    {
        $query->where('is_read', !!$value);
    }

    /**
     * 搜索器 - 时间
     * 
     * @param Query $query 请求
     * @param mixed $value 字段值
     * @param array $data 完整数据
     */
    public function searchTimeAttr($query, $value, $data)
    {
        if (is_array($value)) {
            if (count($value) == 2) {
                $startDate = $value[0] . ' 00:00:00';
                $endDate = $value[1] . ' 23:59:59';
                $query->where('create_time', '>=', $startDate)
                    ->where('create_time', '<=', $endDate);
            } elseif (count($value) == 1) {
                $startDate = $value[0] . ' 00:00:00';
                $now = date('Y-m-d H:i:s');
                $query->where('create_time', '>=', $startDate)
                    ->where('create_time', '<=', $now);
            }
        }
    }

    /**
     * 获取器 - 已读状态
     *
     * @param mixed $value
     * @return array
     */
    public function getIsReadAttr($value)
    {
        return !!$value;
    }

    /**
     * 修改器 - 已读状态
     *
     * @param mixed $value
     * @return array
     */
    public function setIsReadAttr($value)
    {
        return !!$value;
    }
}
